package com.thread;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;

/**
 * 故事情节：在商场的卫生间，好多人回去排队等待上卫生间
 *      在某一时刻，有的卫生间可用，有的卫生间不可用，同时有好多人排队，没空出来一个，下一个人就会进去
 *      人们的素质高的情况下，就是公平锁，没空出来一个下一个人去，但是有时候人们素质很差，空出来一个多个人冲上去抢，就是非公平锁
 */
public class ReentrantLockTest {

    //表示排到第几个人了
    volatile static int index = 0;
    //卫生间门上有个锁，人民素质高: true, 素质低: false
    static ReentrantLock lock = new ReentrantLock(false);

    public static void main(String[] args) {
        start();
    }

    /**
     * 开始活动
     */
    private static void start(){
        //下面实例化来卫生间的路线，有3个路线可以过来
        new Thread(() -> {
            for(;;){
                doing(index++);
            }
        }).start();
        new Thread(() -> {
            for(;;){
                doing(index++);
            }
        }).start();
        new Thread(() -> {
            for(;;){
                doing(index++);
            }
        }).start();
    }

    /**
     * 上厕所这个动作
     */
    private static void doing(int person){
        lock.lock();
        System.out.println("第 " + person + " 个人去了" + Thread.currentThread().getName() + " 坑位！");
        try {
            System.out.println("上卫生间中，顺便抽烟！");
            TimeUnit.SECONDS.sleep(2);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("第 " + person + " 个人完事了！");
        System.out.println("----------------------------");
        lock.unlock();
    }

}
